﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace CreativeModel.FactoryMethod{



    /// <summary>
    /// 创建者类声明了应该返回产品类对象的生产方法。
    /// 创建者类的子类通常提供此方法的实现。
    /// </summary>

    public abstract class Creator{
        
         //请注意，创建者也可能提供一些默认的工厂方法实现。
        
        public abstract IProduct FactoryMethod();
        /*
         请注意，尽管它的名字叫创建者，但创建者的主要职责并不是创建产品。
         通常，它包含一些依赖于由工厂方法返回的产品对象的核心业务逻辑。
         子类可以通过重写工厂方法并从中返回不同类型的产品来间接改变这种业务逻辑。
        */
        public string SomeOperation() {
            //调用工厂方法创建一个产品对象。
            var product = FactoryMethod();
            //现在使用该产品
            var result = $"Creator：The same creator's code has just worker with | {product.Operation()}";

            return result;
        }

    }
    /// <summary>
    /// 产品接口声明了所有具体产品必须实现的操作。
    /// </summary>
    public interface IProduct {
        string Operation();
    }
    //具体创建者覆写工厂方法以改变结果产品的类型。
    class ConcreteCreator_1 : Creator{

        //请注意，方法的签名(类似参数列表和返回类型)仍然使用抽象产品类型，尽管实际上从方法返回的是具体产品。
        //这样，创建者可以保持与具体产品类的独立性。
        public override IProduct FactoryMethod(){
            return new ConcreteProduct_1();
        }
    }
    class ConcreteCreator_2 : Creator{
        public override IProduct FactoryMethod(){
            return new ConcreteProduct_2();
        }
    }

    //具体产品提供了Product接口的各种实现。
    class ConcreteProduct_1 : IProduct
    {
        public string Operation(){
            return "{Result of ConcreteProduct_1}";
        }
    }

    class ConcreteProduct_2 : IProduct{
        public string Operation(){
            return "{Result of ConcreteProduct_2}";
        }
    }


}
